graph TD
    A[程序开始] --> B[初始化GLFW]
    B --> C[设置GLFW参数]
    C --> D[创建窗口]
    D --> E{窗口创建成功?}
    E -->|否| F[输出错误信息]
    F --> G[终止GLFW]
    G --> H[返回-1]
    E -->|是| I[设置当前上下文]
    I --> J[初始化GLAD]
    J --> K{GLAD初始化成功?}
    K -->|否| L[输出错误信息]
    L --> M[终止GLFW]
    M --> N[返回-1]
    K -->|是| O[定义两个三角形顶点数据]
    O --> P[创建两个VAO和两个VBO]
    P --> Q[生成VAO和VBO对象]
    Q --> R[绑定第一个VAO和VBO]
    R --> S[载入第一个三角形数据]
    S --> T[设置顶点属性指针]
    T --> U[启用顶点属性]
    U --> V[绑定第二个VAO和VBO]
    V --> W[载入第二个三角形数据]
    W --> X[设置顶点属性指针]
    X --> Y[启用顶点属性]
    Y --> Z[创建顶点着色器]
    Z --> AA[编译顶点着色器]
    AA --> AB{编译成功?}
    AB -->|否| AC[获取并输出错误日志]
    AC --> AD[清理资源]
    AD --> AE[返回-1]
    AB -->|是| AF[创建第一个片段着色器]
    AF --> AG[编译第一个片段着色器]
    AG --> AH{编译成功?}
    AH -->|否| AI[获取并输出错误日志]
    AI --> AJ[清理资源]
    AJ --> AK[返回-1]
    AH -->|是| AL[创建第二个片段着色器]
    AL --> AM[编译第二个片段着色器]
    AM --> AN{编译成功?}
    AN -->|否| AO[获取并输出错误日志]
    AO --> AP[清理资源]
    AP --> AQ[返回-1]
    AN -->|是| AR[创建黄色着色器程序]
    AR --> AS[创建橙色着色器程序]
    AS --> AT[链接黄色着色器程序]
    AT --> AU{链接成功?}
    AU -->|否| AV[获取并输出错误日志]
    AV --> AW[清理资源]
    AW --> AX[返回-1]
    AU -->|是| AY[链接橙色着色器程序]
    AY --> AZ{链接成功?}
    AZ -->|否| BA[获取并输出错误日志]
    BA --> BB[清理资源]
    BB --> BC[返回-1]
    AZ -->|是| BD[删除着色器对象]
    BD --> BE[注册回调函数]
    BE --> BF[进入渲染循环]
    BF --> BG{窗口应关闭?}
    BG -->|是| BH[清理资源]
    BG -->|否| BI[处理输入]
    BI --> BJ[设置清除颜色]
    BJ --> BK[清除颜色缓冲]
    BK --> BL[使用黄色着色器程序]
    BL --> BM[绑定第一个VAO]
    BM --> BN[绘制第一个三角形]
    BN --> BO[使用橙色着色器程序]
    BO --> BP[绑定第二个VAO]
    BP --> BQ[绘制第二个三角形]
    BQ --> BR[交换缓冲区]
    BR --> BS[轮询事件]
    BS --> BF
    BH --> BT[终止GLFW]
    BT --> BU[程序结束]
    AE --> BT
    AK --> BT
    AQ --> BT
    AX --> BT
    BC --> BT